import Taro from '@tarojs/taro'
import {checkDataType} from './common'
import crypto from './crypto'
import deepClone from './deepClone'
const startSign = 'Ding_D'
const endSign = 'Ding_D'
/**
 * @desc 如果过期时间未-1，代表永不过期
 * @param key
 * @param value
 * @param expire
 * @returns
 */
export function setStorage(key: string, value: any, expire: number = -1) {
  // if (!window.localStorage) {
  //   console.error('浏览器不支持localstorage');
  // }
  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('key值类型需string或number！')
    return null
  }

  const currentTime = new Date().getTime() //当前时间

  const expireTime = expire > 0 ? currentTime + expire * 60 * 60 * 1000 : expire //期望过期时间 单位：小时

  let data = deepClone(value)

  if (checkDataType(value) === 'object' || checkDataType(value) === 'array')
    data = JSON.stringify(value)

  // 添加过期时间
  data += startSign + expireTime + endSign

  let encData = crypto.Encrypt(data) //数据加密

  let keyEncData = crypto.Encrypt(key) //key数据加密

  Taro.setStorageSync('LH-' + keyEncData, encData)
  console.log(`写入本地数据,key:${key},value:${value},expire:${expire}`)
}
/**
 * @desc
 * @param key
 * @returns any|null
 */
export function getStorage(key: string): any {
  // if (!window.localStorage) {
  //   console.error('浏览器不支持localstorage');
  // }
  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('类型错误！')
    return null
  }
  let keyEncData = crypto.Encrypt(key) //key数据加密

  let value = Taro.getStorageSync('LH-' + keyEncData)

  if ([null, undefined].includes(value)) return null

  try {
    const decodeData = crypto.Decrypt(value) //数据解密

    // 获取过期时间
    const expireTime = decodeData
      .substring(decodeData.indexOf(startSign), decodeData.lastIndexOf(endSign))
      .replace(startSign, '')

    // 如果过期时间小于当前时间，移除此localstorage
    if (Number(expireTime) > 0 && Number(expireTime) <= new Date().getTime()) {
      // 获取本地缓存时，检测到有效期过期，直接移除数据
      // 后续如果要做过期检测，更新数据，则可以直接根据返回值，先移除所有缓存，然后重新获取赋值
      Taro.removeStorageSync(key)
      // 返回null值
      return null
    }

    const returnData = decodeData.substring(0, decodeData.indexOf(startSign))

    console.log(
      `读取本地数据,key:${key},value:${returnData},过期时间:${expireTime}`
    )

    if (['undefined', 'null'].includes(returnData)) return null

    return returnData.indexOf('{') === 0 || returnData.indexOf('[') === 0
      ? JSON.parse(returnData)
      : returnData
  } catch (err) {
    console.error('本地数据获取失败！', err)
    return null
  }
}

/**
 * @desc
 * @param key
 * @returns
 */
export function removeStorage(key: string) {
  // if (!window.localStorage) {
  //   console.error('浏览器不支持localstorage');
  // }
  if (checkDataType(key) !== 'string' && checkDataType(key) !== 'number') {
    console.error('类型错误！')
    return
  }

  let keyEncData = crypto.Encrypt(key) //key数据加密

  Taro.removeStorageSync('LH-' + keyEncData)
  console.log(`移除某个本地数据,key:${key}`)
}
/**
 * @desc
 * @returns
 */
export function clearStorage() {
  console.log('清空了本地缓存')

  Taro.clearStorage()

  // if (!window.localStorage) {
  //   console.error('浏览器不支持localstorage');
  // }
  // let keys = Object.keys(localStorage);
  // if (keys.length <= 0) return;
  // for (let i = 0; i < keys.length; i++) {
  //   let key = keys[i];
  //   if (key.indexOf('LH-') === 0) {
  //     Taro.removeStorageSync(key);
  //   }
  // }
}
